﻿using System;
using System.Collections.Generic;
using System.Text;

using GLib.Dao.Sql;

namespace GLib.Model
{
    public class GenericController
    {
        #region METODOS STATICOS
        public static TipoEntidade ObterEntidade<TipoEntidade>(SqlCondition[] condicoes)
        {
            return (TipoEntidade)new GenericDao().GetEntity(typeof(TipoEntidade), condicoes);
        }

        public static TipoEntidade ObterEntidade<TipoEntidade>(int id)
        {
            return (TipoEntidade)new GenericDao().GetEntity(typeof(TipoEntidade), id);
        }
        #endregion
    }

    public class GenericController<Entidade> 
    {
        #region FIELDS
        protected GLib.Model.GenericDao _Dao = new GenericDao();
        protected Entidade _Entidade;
        ListEntity<Entidade> _Lista;
        #endregion

        #region CONSTRUTORES
        public GenericController(ListEntity<Entidade> lista)
        {
            this._Lista = lista;
        }

        public GenericController()
        {
        }
        #endregion

        #region PROPRIEDADE
        protected ListEntity<Entidade> Lista
        {
            get { return this._Lista; }
            set { this._Lista = value; }
        }
        #endregion

        #region METODOS
        public virtual void Novo()
        {
            this._Entidade = (Entidade)System.Activator.CreateInstance(typeof(Entidade));
        }

        public virtual void Salvar()
        {
            this._Lista.Add(this._Entidade);
        }

        public virtual Entidade Obter()
        {
            return this._Entidade;
        }

        public virtual Entidade Editar(int key)
        {
            this._Entidade = (Entidade)this._Dao.GetEntity(typeof(Entidade), key);
            return this._Entidade;
        }

        public virtual void Excluir()
        {
            this._Lista.Remove(this._Entidade);
            this._Entidade = (Entidade)System.Activator.CreateInstance(typeof(Entidade));
        }

        public virtual void Excluir(int key)
        {
            this._Lista.Remove(this._Lista.GetItem(key));
            this._Entidade = (Entidade)System.Activator.CreateInstance(typeof(Entidade));
        }

        public virtual IList<Entidade> Listar(SqlCondition[] condicoes, SqlOrdenation[] ordenacoes)
        {
            if (condicoes == null && ordenacoes != null)
                this._Lista.Ordenation(ordenacoes);

            if (condicoes != null)
                return this._Lista.Filtering(condicoes, ordenacoes);
            
            return this._Lista;
        }
        #endregion     
    }
}
